#ifndef FUN_H
#define FUN_H

#include <QWidget>
#include "QTextEdit"
#include "QLabel"
#include "QPushButton"
#include "qcustomplot.h"
#include "QLineEdit"
#include<numeric>
struct test_info
{
    QString test_id;//<试样编号
    QString test_md;//<试样密度
    QString test_hd;//<试样厚度
    QString test_gz;//<试样构造
    QString test_tj;//<状态调节
    QString test_Ddate;//<到样日期
    QString test_scdm;//<生产单位
    QString test_sjdm;//<送检单位
    QString test_syxx;//<试验现象
    QString test_sybz;//<试验备注

    //试样编号,试样密度，试样厚度，试样构造，状态调节，到样日期，生产单位，送检单位，试验现象，试验备注
    test_info(QString test_id=nullptr,QString test_md=nullptr,QString test_hd=nullptr,
              QString test_gz=nullptr,QString test_tj=nullptr,QString test_Ddate=nullptr,
              QString test_scdm=nullptr,QString test_sjdm=nullptr,QString test_syxx=nullptr,
              QString test_sybz=nullptr

              ): test_id(test_id),test_md(test_md),test_hd(test_hd),test_gz(test_gz),test_tj(test_tj)
                 ,test_Ddate(test_Ddate),test_scdm(test_scdm),test_sjdm(test_sjdm),test_syxx(test_syxx)
                 ,test_sybz(test_sybz)
    {}//<试样编号,试样密度，试样厚度，试样构造，状态调节，到样日期，生产单位，送检单位，试验现象，试验备注

};


struct test_system
{
    QString system_pass;//<管理员密码    
    QString system_user;//<注册实验室
    double system_jrs;//<加热丝热值
    double system_bjs;//<苯甲酸热值
    double system_tjw1;//<添加物热值1
    double system_tjw2;//<添加物热值2
    double system_rrl1;//<当前热容量
    double system_rrl2;//<修正热容量
    int system_zsti;//<注水时间
    int system_psti;//<排水时间
    QString system_com;//<串口名称
    QString system_tcp;//<IP地址
    QString system_port;//<端口号

    QString sqldatae_name;//数据库文件名
    QString system_repass;//<修改密码


    //管理员密码,修改密码，注册实验室，加热丝热值，苯甲酸热值，添加物热值1，添加物热值2，当前热容量，修正热容量，注水时间,排水时间,串口名称,IP地址,端口号
    test_system(QString system_pass=nullptr,QString system_user=nullptr,
              double system_jrs=0,double system_bjs=0,double system_tjw1=0,
              double system_tjw2=0,double system_rrl1=0,double system_rrl2=0,
              int system_zsti=0,int system_psti=0,QString system_com=nullptr,QString system_tcp=nullptr
             ,QString system_port=nullptr

              ): system_pass(system_pass),system_user(system_user),system_jrs(system_jrs)
                 ,system_bjs(system_bjs),system_tjw1(system_tjw1),system_tjw2(system_tjw2),system_rrl1(system_rrl1),system_rrl2(system_rrl2)
                 ,system_zsti(system_zsti),system_psti(system_psti),system_com(system_com),system_tcp(system_tcp),system_port(system_port)
    {}

};

struct test_data
{
    QString data_id;//<试样编号    
    double data_t1;//<起点温度
    double data_t2;//<终止温度
    double data_sum;//<总热值
    double data_tjw;//<添加物热值
    double data_bjs;//<苯甲酸热值
    double data_jrs;//<发热丝热值
    double data_dtl;//<弹筒热值
    double data_sdl;//<水当量热值
    double data_zp;//<制品热值
    QString data_d1;//<开始时间
    QString data_d2;//<结束时间

    QString data_index;//<试样序号
    QList<QStringList> sql_data;

    //试样编号,起点温度，终止温度，总热值，添加物热值，苯甲酸热值，发热丝热值，弹筒热值，水当量热值，制品热值,开始时间,结束时间
    test_data(QString data_id=nullptr,double data_t1=0,double data_t2=0,double data_sum=0,
              double data_tjw=0,double data_bjs=0,double data_jrs=0,
              double data_dtl=0,double data_sdl=0,double data_zp=0,
              QString data_d1=nullptr,QString data_d2=nullptr

              ): data_id(data_id),data_t1(data_t1),data_t2(data_t2),data_sum(data_sum)
                 ,data_tjw(data_tjw),data_bjs(data_bjs),data_jrs(data_jrs),data_dtl(data_dtl),data_sdl(data_sdl)
                 ,data_zp(data_zp),data_d1(data_d1),data_d2(data_d2)
    {}

};

struct test_buf
{
    double buf_tn=0;//<当前温度
    double buf_tl=0;//<最低温度
    double buf_th=0;//<最高温度
    double buf_tc=0;//<温度差
    double buf_rr=0;//<热容量
    double buf_fr=0;//<发热量

    double buf_zg;//质量
    double buf_bjsg;//质量
    double buf_tjwg;//质量


    QVector<double>buf_t;//<600秒温度缓存
    QVector<double>buf_i;//<600秒

    QVector<double>buf_ct;//<
    QVector<double>buf_ci;//<


    bool  zs=0;//<注水
    bool  ps=0;//<注水
    bool  jp=0;//<搅拌
    bool  dh=0;//<排水
    bool  run=0;//一键启动

    QByteArray writedata;
    QByteArray readdata;


    //当前温度,最低温度，最高温度，温度差，热容量，发热量
    test_buf(double buf_tn=0,double buf_tl=0,double buf_th=0,double buf_tc=0,
              double buf_rr=0,double buf_fr=0

              ): buf_tn(buf_tn),buf_tl(buf_tl),buf_th(buf_th),buf_tc(buf_tc)
                 ,buf_rr(buf_rr),buf_fr(buf_fr)
    {}

};



struct test_temp
{
    QString  test_id;//实验编号
    QString  test_index;//试验次序
    QString  test_ti;//试验秒数
    QString  test_tk;//试验温度
    QString  test_tn;//试验日期

};
struct Point2i
{
    double x,y;
    Point2i(double x=0,double y=0):x(x),y(y){}
};


/*
下发指令：
EE B1 11 00 01 00 04 11 00（A） 00（B） 00（C）00（D）10（E）00（F） 00（G） 00（H） 00（I） 00 00 00 00 00 00 00 FF FC FF FF
A：10 点火启动，00点火停止（输出交流24V）    //8
B：10 搅拌启动，00搅拌停止                 //9
C：10 注水启动，00注水停止                 //10
D：10 排水启动，00排水停止                 //11
E：
F：10小桶排水启动，00排水停止              //13
G：
H：
I：10外水桶制冷工作，00停止工作            //16
*/


typedef struct
{
     test_info     info;
     test_data     data;
     test_buf      buf;
     test_system   system;

     quint16       tec_buf[100];
     double        temp_water=0;
     double        temp_air=0;
     double        temp_ctrl=24.0;//水温控制
     bool          tec_control=true;
     double        temp_waitong=0;//外筒温度
     double        temp_env=0;//环境温度

     QByteArray  writeData;
     quint8 write_buf[28]={0xEE,0xB1,0x11,0x00,0x01,0x00,0x04,0x11,
                           0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                           0xFF,0xFC,0xFF,0xFF};

     int   waterIn=0;

     int  fire_con=0;//点火丝状态

}test;

struct tcp_bus_type
{
    quint16   f_num;        //事务标识符
    quint16   header_1;     //Modbus TCP协议
    quint16   header_2;     //后面有00 06个字节数据
    quint8    id;           //单元标识符
    quint8    type;         //功能码（读线圈）
    quint16   start;        //开始读的数据的地址
    quint16   readNum;      //从开始位置读00 04个数据。

    quint16   byteNum;     //回复字节
    quint8    dataNum;     //数据字节
};



//sql  批量插入
#if 0

if (jsondata.contains(QString("smoke"))) {
        QJsonArray smokearray=jsondata.value(QString("smoke")).toArray();
        if(smokearray.size()==0){
                return;
        }
        QVariantList sensoridList;
        QVariantList positionList;
        QVariantList batteryList;
        QVariantList statuscodeList;
        QVariantList statusdescList;
        QVariantList ctList;
        for (int i = 0; i <  smokearray.size(); ++i) {
            QJsonObject smokeobj=smokearray.at(i).toObject();
            sensoridList<< smokeobj.value(QString("sensorid")).toString();
            positionList<<smokeobj.value(QString("position")).toString();
            batteryList<< smokeobj.value(QString("battery")).toInt();
            statuscodeList<<smokeobj.value(QString("statuscode")).toInt();
            statusdescList<<smokeobj.value(QString("statusdesc")).toString();
            ctList<<smokeobj.value(QString("ct")).toInt();
        }
        QSqlDatabase db;
        if(QSqlDatabase::contains("my_sql_connection")){
                db=QSqlDatabase::database("my_sql_connection");
        }else{
                db=QSqlDatabase::addDatabase("QSQLITE","my_sql_connection");
        }
        db.setDatabaseName(dburl);
        if( !db.open() ){
            qDebug()<<"open db is error";
            return;
        }else{
            QSqlQuery query(db);
            QString insert_sql ="INSERT INTO smokedata (sensorid,position,battery,statuscode,statusdesc,ct) "
             "VALUES (:sensorid,:position,:battery,:statuscode,:statusdesc,:ct)";
            query.prepare(insert_sql);
            query.bindValue(":sensorid", QVariant(sensoridList));
            query.bindValue(":position", QVariant(positionList));
            query.bindValue(":battery", QVariant(batteryList));
            query.bindValue(":statuscode", QVariant(statuscodeList));
            query.bindValue(":statusdesc", QVariant(statusdescList));
            query.bindValue(":ct", QVariant(ctList));
            query.execBatch();
        }
        db.close();
        QSqlDatabase::removeDatabase("QSQLITE");

    }
#endif




#endif // FUN_H
